package pe.gob.mininter.dirandro.vaadin.panel.inteligencia;

import java.util.List;

import pe.gob.mininter.dirandro.model.DetGremioCocalero;
import pe.gob.mininter.dirandro.model.GremioCocalero;
import pe.gob.mininter.dirandro.model.Inteligencia;
import pe.gob.mininter.dirandro.service.DetalleGremioInteligenciaService;
import pe.gob.mininter.dirandro.service.GremioService;
import pe.gob.mininter.dirandro.util.HarecUtil;
import pe.gob.mininter.dirandro.vaadin.panel.util.PanelAgregarGremio;
import pe.gob.mininter.dirandro.vaadin.util.Injector;

import com.vaadin.annotations.AutoGenerated;
import com.vaadin.data.Item;
import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.data.Property.ValueChangeListener;
import com.vaadin.data.util.BeanItemContainer;
import com.vaadin.data.util.IndexedContainer;
import com.vaadin.ui.AbstractSelect.Filtering;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.ComboBox;
import com.vaadin.ui.CustomComponent;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.Table;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.Window;

public class PanelRegistroInteligenciaGremio extends CustomComponent  implements ClickListener{

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	@AutoGenerated
	private VerticalLayout mainLayout;
	@AutoGenerated
	private VerticalLayout pnlPrincipal;
	@AutoGenerated
	private Table tblGremio;
	@AutoGenerated
	private HorizontalLayout horizontalLayout_1;
	@AutoGenerated
	private Button btnAgregar;
	@AutoGenerated
	private Button btnNuevo;
	@AutoGenerated
	private ComboBox cmbGremio;
	@AutoGenerated
	private Label label_1;
	
	private IndexedContainer container;
	private Inteligencia inteligencia;
	private DetGremioCocalero detalleGremio;
	private List<DetGremioCocalero> lstGremio;
	private boolean inicializado=false;
	private GremioService gremioService;
	private DetalleGremioInteligenciaService detalleGremioInteligenciaService;
	private PanelAgregarGremio panelAgregarGremio;
	
	public Inteligencia getInteligencia() {
		return inteligencia;
	}

	public void setInteligencia(Inteligencia inteligencia) {
		this.inteligencia = inteligencia;
		System.out.println("seteada inteligencia");
		postConstruct();
	}

	/**
	 * The constructor should first build the main layout, set the
	 * composition root and then do any custom initialization.
	 *
	 * The constructor will not be automatically regenerated by the
	 * visual editor.
	 */
	public PanelRegistroInteligenciaGremio() {
		buildMainLayout();
		setCompositionRoot(mainLayout);
		detalleGremioInteligenciaService = Injector.obtenerServicio(DetalleGremioInteligenciaService.class);
		gremioService = Injector.obtenerServicio(GremioService.class);
		postConstruct();
	}

	private void postConstruct(){
		if(inteligencia!=null && !inteligencia.esNuevo() && !inicializado){
			
			cmbGremio.setInputPrompt("Gremio Cocalero");
			cmbGremio.setItemCaptionPropertyId("nombre");
			actualizaListaGremios(); 
			
			container = new IndexedContainer();
			container.addContainerProperty("id", Long.class, null);
			container.addContainerProperty("gremio", GremioCocalero.class, null);
			container.addContainerProperty("gremio.nombre", String.class, null);
			container.addContainerProperty("gremio.siglas", String.class, null);
			container.addContainerProperty("gremio.ubicacion", String.class, null);
			container.addContainerProperty("gremio.cuenca", String.class, null);
			
			tblGremio.setSelectable(true);
			tblGremio.setImmediate(true);
			tblGremio.setNullSelectionAllowed(true);
			tblGremio.setNullSelectionItemId(null);
			tblGremio.addListener(new ValueChangeListener() {
				
				private static final long serialVersionUID = -3416533772693474159L;
	
				@Override
				public void valueChange(ValueChangeEvent event) {
					boolean esModoNuevo = tblGremio.getValue() == null;
					limpiar();
					habilitarEdicion(!esModoNuevo);
					if (!esModoNuevo) {
						Item item = tblGremio.getItem(tblGremio.getValue());
						
						detalleGremio.setId((Long) item.getItemProperty("id").getValue());
						cmbGremio.select((GremioCocalero) item.getItemProperty("gremio").getValue());
					}
				}
			});
			
			btnAgregar.addListener((ClickListener)this);
			btnNuevo.addListener((ClickListener)this);
			
			llenaPanel();
			
			limpiar();
			habilitarEdicion(false);
			inicializado=true;
			
		}
	}
		
	private void llenaPanel(){
		DetGremioCocalero detGrem = new DetGremioCocalero();
		detGrem.setInteligencia(inteligencia);
		lstGremio = detalleGremioInteligenciaService.buscar(detGrem);
		container.removeAllItems();
		int con=1;
		if ( lstGremio != null) {
	    	 for (DetGremioCocalero imagen: lstGremio) {
	             Item item = container.addItem(con++);
	             item.getItemProperty("id").setValue(imagen.getId());
	             item.getItemProperty("gremio").setValue(imagen.getGremioCocalero());
	             item.getItemProperty("gremio.nombre").setValue(imagen.getGremioCocalero().getNombre());
	             item.getItemProperty("gremio.siglas").setValue(imagen.getGremioCocalero().getSiglas());
	             item.getItemProperty("gremio.ubicacion").setValue(imagen.getGremioCocalero().getDistrito()!=null?imagen.getGremioCocalero().getDistrito().getNombreCompleto():"");
	             item.getItemProperty("gremio.cuenca").setValue(HarecUtil.valorNombreToEmpty(imagen.getGremioCocalero().getCuenca()));
	        }
	    }
		
		tblGremio.setContainerDataSource(container);
		tblGremio.setVisibleColumns(new Object[]{"gremio.nombre","gremio.siglas","gremio.ubicacion","gremio.cuenca"});

	}
	
	@Override
	public void buttonClick(ClickEvent event) {
		if(event.getButton().equals(btnAgregar)) {
			
			detalleGremio.setGremioCocalero((GremioCocalero)cmbGremio.getValue());
			
			if(detalleGremio.esNuevo()){
				detalleGremioInteligenciaService.crear(detalleGremio);	
			}else{
				detalleGremioInteligenciaService.actualizar(detalleGremio);
			}
			
			limpiar();
			llenaPanel();
			return;
		}
		if(event.getButton().equals(btnNuevo)) {
			panelAgregarGremio = new PanelAgregarGremio();

			Window window=new Window(){
				
				private static final long serialVersionUID = 1L;

				  protected void close() {
					  getApplication().getMainWindow().removeWindow(getWindow());
				  }
				  @Override
					public void detach() {
					  
					  actualizaListaGremios();
					  if(panelAgregarGremio.getGremioCocalero()!=null)
							cmbGremio.select(panelAgregarGremio.getGremioCocalero());
						
					}
			};
			window.setCaption("Registrar Gremio");
			window.addComponent(panelAgregarGremio);
			window.setModal(true);
			window.setResizable(false);
			window.setWidth("550px");
			window.setHeight("-1px");
			getApplication().getMainWindow().addWindow(window);

			return;
		}
	}

	public void actualizaListaGremios() {
		cmbGremio.setContainerDataSource(new BeanItemContainer<GremioCocalero>(GremioCocalero.class,  gremioService.buscar(null)));
		cmbGremio.setItemCaptionPropertyId("nombre");
		cmbGremio.setFilteringMode(Filtering.FILTERINGMODE_CONTAINS);
		cmbGremio.setImmediate(true);
	}
	
	private void limpiar(){
		detalleGremio = new DetGremioCocalero();
		detalleGremio.setInteligencia(inteligencia);
		cmbGremio.select(null);
	}
	
	private void habilitarEdicion(boolean flag){
		if(flag){
			btnAgregar.setCaption("Actualizar");
		}
		else{
			btnAgregar.setCaption("Registrar");
		}
	}
	
	@AutoGenerated
	private VerticalLayout buildMainLayout() {
		// common part: create layout
		mainLayout = new VerticalLayout();
		mainLayout.setImmediate(false);
		mainLayout.setWidth("100%");
		mainLayout.setHeight("100%");
		mainLayout.setMargin(true);
		
		// top-level component properties
		setWidth("100.0%");
		setHeight("100.0%");
		
		// pnlPrincipal
		pnlPrincipal = buildPnlPrincipal();
		mainLayout.addComponent(pnlPrincipal);
		
		return mainLayout;
	}

	@AutoGenerated
	private VerticalLayout buildPnlPrincipal() {
		// common part: create layout
		pnlPrincipal = new VerticalLayout();
		pnlPrincipal.setImmediate(false);
		pnlPrincipal.setWidth("-1px");
		pnlPrincipal.setHeight("-1px");
		pnlPrincipal.setMargin(false);
		pnlPrincipal.setSpacing(true);
		
		// label_1
		label_1 = new Label();
		label_1.setImmediate(false);
		label_1.setWidth("-1px");
		label_1.setHeight("-1px");
		label_1.setValue("Referencia del Documento Inteligencia:");
		pnlPrincipal.addComponent(label_1);
		
		// horizontalLayout_1
		horizontalLayout_1 = buildHorizontalLayout_1();
		pnlPrincipal.addComponent(horizontalLayout_1);
		
		// tblGremio
		tblGremio = new Table();
		tblGremio.setImmediate(false);
		tblGremio.setWidth("600px");
		tblGremio.setHeight("200px");
		pnlPrincipal.addComponent(tblGremio);
		
		return pnlPrincipal;
	}

	@AutoGenerated
	private HorizontalLayout buildHorizontalLayout_1() {
		// common part: create layout
		horizontalLayout_1 = new HorizontalLayout();
		horizontalLayout_1.setImmediate(false);
		horizontalLayout_1.setWidth("-1px");
		horizontalLayout_1.setHeight("-1px");
		horizontalLayout_1.setMargin(false);
		horizontalLayout_1.setSpacing(true);
		
		// cmbGremio
		cmbGremio = new ComboBox();
		cmbGremio.setImmediate(false);
		cmbGremio.setWidth("-1px");
		cmbGremio.setHeight("-1px");
		horizontalLayout_1.addComponent(cmbGremio);
		
		// btnNuevo
		btnNuevo = new Button();
		btnNuevo.setCaption("Nuevo");
		btnNuevo.setImmediate(true);
		btnNuevo.setWidth("-1px");
		btnNuevo.setHeight("-1px");
		horizontalLayout_1.addComponent(btnNuevo);
		
		// btnAgregar
		btnAgregar = new Button();
		btnAgregar.setCaption("Agregar");
		btnAgregar.setImmediate(true);
		btnAgregar.setWidth("-1px");
		btnAgregar.setHeight("-1px");
		horizontalLayout_1.addComponent(btnAgregar);
		
		return horizontalLayout_1;
	}

}
